// 权限文件
// 引入进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css' // progress bar style
import router from './router'
import store from './store'
NProgress.configure({ showSpinner: false }) // NProgress Configuration

// 白名单
const whiteList = ['/login', '/404']

// 路由前置守卫
router.beforeEach(async (to, from, next) => {
    // 开启进度条
    NProgress.start()

    // 获取token
    const token = store.getters.token

    // 判断
    if (token) {
        // 去不去登录页面
        if (to.path === '/login') {
            next('/')
            // 关闭进度条
            NProgress.done()
        } else {
            // 有没有用户信息
            const isGetUserInfo = store.getters.isGetUserInfo
            // 如果有用户信息就直接放行
            if (isGetUserInfo) {
                next()
            } else {
                // 如果没有用户信息，尝试获取用户信息
                try {
                    await store.dispatch('user/A_userInfo')
                    // 拿到用户角色
                    const role = store.getters.role
                    // 获取可以被循环拿到的动态路由
                    let accessRoutes = await store.dispatch('permission/generateRoutes', role)
                    // 循环添加动态路由
                    accessRoutes.forEach(route => {
                        router.addRoute(route)
                    })
                    // 设置用户状态为true
                    store.commit('permission/SET_USERINFO_STATE', true)
                    //hack方法 无线向下跳转 保证路由添加成功
                    //replace true 路由历史栈里面不会保存路由 为了防止后退
                    next({ ...to, replace: true })
                } catch (error) {
                    // 等待用户信息被清空
                    await store.dispatch('A_command')
                    next(`/login?redirect=${to.path}`)
                }

            }
        }





    }
    else {
        // 去不去白名单
        if (whiteList.includes(to.path)) {
            next()
        } else {
            //跳转到登录页面 携带去的地址
            next(`/login?redirect=${to.path}`)
            // 关闭滚动条
            NProgress.done()
        }
    }
})




// 路由后置守卫
router.afterEach(() => {
    // 关闭滚动条
    NProgress.done()
})